Version 2.7  16/01/2000
------------
  UDPHeader is V1.4, UDPFuncs are V1.6- Net protocol header is now in
with UDPHeader.
- This is an optimised version of V2.6, where nearly all the string work
is replaced by buffers and pointers (all Unreliable packet work is done
entirely with buffers now).
- Fixed the bug introduced in V2.6, where a Client would be disconnected
after a few seconds, after a second (or more) login(s).
- Data from Reliable and UnReliable Packets is now returned as a pointer
to a buffer with new a Function Get_Game_Data{}, so no more using
Security_Warning{}. :)
- It has Rodger Light's assembler bsdsocket access put in, instead of the
Blitz lib, so you can now start the program without Miami needing to be
running first.
- This documentation changed to HTML, to make things easier.

 Version 2.6  25/08/1999
------------
  Changed the directory name to UDP_Chat instead of UDPtest, as it's no
longer just a small test program ;-)
  Changed packet numbering for Reliable packets to a two-dimensional
array (player,message), so packets to each player are tracked separately,
instead of all messages being in one array. Overall this has sped things
up slightly, and has made the code much tidier in places. Also, I can now
easily put in checking for out-of-order incoming packets, and ask for a
resend. 
  Added Putting the UDP Funcs into your game item under the UDP Funcs
section- about bloody time! :) 
  Net_protocol_header is V0.6, UDPHeader is V1.3, UDPFuncs are V1.5 
- the UDP socket buffer is now cleared when reconnecting.  
  Added in 'player_info.info' array to store information for sending to 
other players, so it's not hard-coded into the Funcs anymore. See
Putting the UDP funcs in your game for details.
  The Client's system time is now synched with the Server's (a fiendish
bit of coding that was! :) The system time can be accessed on any machine
by the global variable `system_time.l'. Button '3' now prints out your
current system time.
  The parameters passed to Send_Reliable_Message are now:
Send_Reliable_Message(address.l,data_length.w,player.w,protocol,ordering)
and Send_Unreliable_Message(address.l,data_length.w,player,protocol)
for Send_Unreliable_Message. This is a setup for later optimisations
I'll be doing. So now the address and length of memory to be sent is
passed instead of the String itself. Also I've set the Functions up to
allow for the Client-Server protocol in Unreliable messages (it's also set
up in Reliable), and to allow you to specify wether Reliable packets have
to be received ordered or can be received unordered. Neither of these
additions have been implemented yet though.
See Putting the UDP funcs into your game for more details.
  Note the Arexx routines cause an Enforcer hit, and the ReadUDP Function
causes a couple- I'll have a look at them soon! :)

 Version 2.5  14/06/1999 
------------
  Shifted LocalHost: button to the left to allow for longer localhost
names.
  You can now send and receive Unreliable messages. I've added 
the Function Send_Unreliable_Message. Decode_Packet now recognises
unreliable packets and sends them to Security_Warning to be printed out. 
  Button 7 now toggles between sending Reliable and Unreliable messages.
Any sent unreliable messages now have SU at the beginning of the line,
and any received unreliable messages have RU at the beginning.
  Fixed a bad bug- well bad programming I'd done early on actually. 
Send_Reliable_Message was changing last_message_number at certain times,
when only Find_Next_Message should have been dealing with it- naughty! 
  UDP_Header is V1.2, the net protocol header is now V0.5 
  I've changed Security_Warning and Comms_Debug, so they now put the
messages into arrays rather than calling Print_String. Instead you can
get the messages by calling either Read_Security_Warning, or 
Read_Comms_Debug_Messages which return either a message or empty
string "", if there's no more messages waiting to be printed out. 
  Print_String has been put with the Game functions, so now you can cut
and paste all the UDP stuff into your program in one section.
  Added some more Theory to the Guide.

 Version 2.4  26/4/1999 
------------
  Changed Exit - I took all the UDP stuff out of it and put it into 
Close_UDP, in UDP_Funcs- Exit now calls Close_UDP instead. I took
all the non comms stuff out of Comms_Housekeeping and put it into
General_Housekeeping. I've added in lots of constants like #ONLINE,
#SERVER, #HIGH etc, to make things easier to read and understand.
  All the  Functions, Variables/Constants and Dims have been separated
into Game (specific to UDP_Chat and can be easily changed for your game), and 
UDP (specific only to the UDP Functions and independant of your game). 
Print_String is before the UDP Functions, but when I change 
Security_Warning and Comms_Debug to be GUI independant, it can be put
with the Game Functions.
   All Print_String calls in the Funcs have been replaced with 
Security_Warning or Comms_Debug calls- they are called with different
levels of degree, so you can just, for example print out System messages or
all Security messages (from High priority to Low), by changing the variables
`security' and `comms_debug_level'. So now it's much easier to put the
UDP_Funcs into your game, as I've almost fully made the UDP_Funcs independant
of the GUI.
   Added checking in Decode_Packet, to make sure that we should be 
able to receive the current packet in our current online state. 
  Changed #DEBUG TO #COMMS_DEBUG. Comms_Housekeeping now returns wether
we have been connected, disconnected or our connection attempt was rejected.
#MAX_NUMBER_PLAYERS has been changed to a variable (max_number_players), to
allow user to change the maximum number of allowed players (the function is
is done, but I haven't written a GUI example yet).
  Security_Warning has been moved in with the other UDP Funcs, along with
Comms_Debug- at the moment they print to the GUI, but soon I will have
them putting their messages into arrays, to allow them to be independant of
the GUI. Added #SERVER_NUMBER=1, as the #SERVER number is changed to allow 
for the added #ATTEMPTING_TO_CONNECT state. A few other changes are made
for this as well.
  UDP_Funcs is now V1.4. UDP_Header is V1.1 .
  Fixed a couple of small bugs in Requested_Connection, and changed it's
reply for a failed connection attempt to an unreliable message (WriteUDP).
Fixed a couple of small bugs in Decode_Packet, and re-arranged it a bit
to make in independant of the GUI. The call to Read_UDP is now done from
Decode_Packet, instead of Comms_Housekeeping.
   Window_Events had a couple of disconnect bugs and it's been changed
to allow for the #ATTEMPTING_TO_CONNECT status. General_Housekeeping
prints out the lag times now. 
   UDP_Chat no longer starts up being able to act as Server, you have to
put it in Server mode (as you would in a game) first- there's a Function,
Initialise_Server to do it, and a button in UDP_Chat to put you in 
Server mode. Also there's a Disconnect button to disconnect you from the
game if you're a Client, and to close down the game and take you out of 
Server mode if you're the Server- this done with the Disconnect_From_Game
Function. 
  The Delay buttons are now changed to button 1: (Delay 1 second), and 
2: (Delay 80 seconds), also button 8: pauses (freezes) and unpauses UDP_Chat.
It prints `Me' in the lag time area at your player number, if you're a
Client and Serv in the player 1 position if you're acting as Server.
  All the Game Functions have been separated out and put together after
the UDP_Funcs. The UDP Newtypes have been put into UDP_Header and the Game
variables, constants, and Dims have been separated from the UDP ones and put 
above the Game Functions. When I fix Security_Warning and Comms_Debug
I can put Print_String in with the Game Functions, so all the UDP stuff
will be together, so all you'd have to do to put them into your game is copy
the entire UDP section and then paste it above your own Functions! All the
UDP Functions could be put into the UDP_Funcs include if you didn't want
them in your program.  

 Version 2.3  7/3/1999 
------------    
  I've put in the auto-disconnect code, for when a player stops
responding. If a player can't communicate when another player it
tells the server this- then the Server checks this fact and tells all
the players if this is true. This is for the rare case that two
players have a connection to a third, but only one of those players
loses connection to the third one. If the server can communicate with
the player that's thought to be offline, then the player that
initiated the call gets disconnected instead. This is just some
simple security, to stop cheating by getting the other person
disconnected. 
   I've tidied up the main loop and taken most stuff out of it- most
of the work is now done by the Comms_Housekeeping Function. It's
now much easier to slot these functions into your game.
   Added the Clear_Player_Arrays Statement to re-initialise a
disconnected player's data.
  Fixed some disconnecting bugs, and now Requested_Connection
checks wether the host and port are already connected (it was
possible before to let a host log in twice- if you got the timing
wrong!)
  Added Security_Warning to allow people to have security messages
printed out in their game- you can chose all, medium, or only serious
security warnings. 
  Some repeated code in Comms_Housekeeping and Acknowledge_Packet
has been shifted to Resend_Message.

 Version 2.2  14/11/1998 (internal version- not released)
------------            
    The disconnect code has been put in, and I tidied up the Decode_Packet
and Requested connection functions (no more passing variables between them
through Global variables- naughty :).
  Also I've changed the Packet protocol a bit- all packets now have a
packet number (.l) in the front, wether they need it or not, as it makes
the encoding and decoding of packets much simpler.
  Acknowledge_Packet now checks wether the packet number is in correct
bounds to prevent it getting in a loop, if a bad packet is received.
  If the Server closes, it sends the #GAME_END message to all players,
if a player closes, it sends #CP_REQ_PLAYER_DISCONNECT with it's player
number to the Server, then the Server informs all the players (including
the one that sent the disconnect message) that the player has quit, then
the player quits when it receives the disconnect message with it's
player number.
  Once a Client or Server has started to quit, it will quit after a certain
time-out, even if it doesn't get all the responses it required.
            
 Version 2.1  02/10/1998
------------
  Fixed the dead link bug- if after 5 resends there's no reply, it now 
acknowledges that packet and stops resending- 
( Acknowledge_Packet(message_number) on line 649 should have been
Acknowledge_Packet(last_message_number) )- doh
  Put docs into AmigaGuide- yay :-)  - and added some things to the 
`Things to Do' list.

 Version 2.0  27/07/1998
------------
  Changed printing of Ping times, so they are now printed out correctly for
each player, and you can now tell what your player number now is (`Me' is
printed in place of your Ping time). Before it just printed out the 
Ping time of the last packet received. The Server is always Player 1. I
fixed a bug which was numbering the clients wrongly, at the same time.
  Put in a ARexx interface, so you can log into a Server from AmiComSys, 
by passing the host address to UDP_Chat from AmiComSys (through a small
Rexx program).
  The Function Connect_UDP has been renamed to the more logical 
Initialise_UDP, as it doesn't actually connect to anything.  It now 
closes the bsdsocket.library in Initialise_UDP instead of at the end
of the program- Paul had done this in his TCP_Funcs, but I hadn't 
transfered his code across properly. :-/
  I renamed the programs to their actual version number, rather than 
the quick filename I gave them (ie: UDP_ChatV1.9.bb2, rather than
UDP_Chat4.bb2)- doh!
  Changed Close_UDP to Exit and put it back in UDP_Chat. It now
deallocates the receive memory buffer (UDP_mem.l) allocated in
UDPHeader.bb2, and closes the Rexxport and UDP socket if they've been
opened, (tidier than having it all at the end). So you can just call
Exit to exit from anywhere (with an error string if needed), rather than
have those naughty Gotos! :)  Initialised `sock.l' to -1 so Exit routine
can work
   Added in a #DEBUG constant to switch on debug info, and allow multiple
copies of UDP_Chat on one machine (currently all debug info is still
printed out).
   Changed default Port number to 27,272- (3,001 was too low for practical
use). Put `ypos' above `GoSub Init_Gui', so can now call Exit from
Init_Gui.
   Added this History File!

 Version 1.9   24/04/1998
------------
  Original Aminet release. Several bugs known, and a several features
not yet implemented.

History
Converted with g2h, © 24.06.1998 N. DARNIS